const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const bodyParser = require('body-parser');
const session = require('express-session');
const errorhandler = require('errorhandler')

const loginRoute = require('./routes/LoginRoute');
const bookRoute = require('./routes/BookRoute');

const app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(bodyParser.urlencoded({extended: true}));
// app.use(express.urlencoded({ extended: false }));
app.use(cookieParser("book app"));
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
    // id: Mock.Random.guid(),
    secret: 'book app',   // 可以随便写。 一个 String 类型的字符串，作为服务器端生成 session 的签名
    name: 'session_id',/*保存在本地cookie的一个名字 默认connect.sid  可以不设置*/
    resave: false,   /*强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。*/
    saveUninitialized: true,   //强制将未初始化的 session 存储。  默认值是true  建议设置成true
    cookie: {
        maxAge: 60 * 1000 * 30   /*过期时间30分钟*/
    },   /*secure https这样的情况才可以访问cookie*/
    //设置过期时间比如是30分钟，只要游览页面，30分钟没有操作的话在过期
    rolling: true //在每次请求时强行设置 cookie，这将重置 cookie 过期时间（默认：false）
}));
//中间件，统一处理打印及分页插件，必须写在路由之前
app.use((req, res, next) => {
    console.log("req.url:" + req.url)
    console.log("req.body:" + req.body);
    let {pageNum, pageSize} = req.query;
    console.log("pageNum:" + pageNum, "pageSize:" + pageSize);
    if (pageNum && pageNum.trim().length > 0) {
        console.log("pageNum:" + pageNum);
        pager.pageNum = parseInt(pageNum);
    }
    if (pageSize && pageSize.trim().length > 0) {
        console.log("pageSize:" + pageSize);
        pager.pageSize = parseInt(pageSize);
    }
    next();
});
app.use((req, res, next) => {
    if (req.session.loginBean) {
        //登录过
        console.log("登录过");
        next();
    } else {
        //白名单
        let whiteUrls = ["/", "/login.html", "/login.do"];
        if (whiteUrls.some(value => req.path.endsWith(value))) {
            next();
        } else {
            console.log("没有登录过");
            res.redirect("/login.html");
            res.end();
        }
    }
})

//路由，必须在bodyParser后面
app.use('/', loginRoute);
app.use('/book', bookRoute);
// const err = createError(404);
// catch 404 and forward to error handler
// app.use(function(req, res, next) {
//   next(err);
// });

// error handler

app.use(function (err, req, res, next) {
    console.error("错误信息：", err.stack)
    // res.status(500).send('Something broke!')
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
})
// process.on('uncaughtException', function (err, req, res, next) {
//     console.log("出错了uncaughtException");
//     console.log(err);
// }) //监听未捕获的异常
//
// process.on('unhandledRejection', function (err, promise, req, res, next) {
//     console.log("出错了unhandledRejection");
//     console.log(err);
//     promise.catch(function () {
//
//     });
// }) //监听Promise没有被捕获的失败函数

// app.use(errorhandler);
app.listen(8080, () => {
    console.log("服务启动成功，http://localhost:8080");
})

module.exports = app;
